# Cargo modulo para hacer ploteo
import pylab as p
import sys
from util import distance

# Cargo variables globales necesarias
from globalVar import GLOBAL_VAR, K_VS_TIME, LOGS

# Constante con nombre de arcvhivo de log a ser usado para el plot.
# Sirve en caso que la funcion no es llamada por el modulo principal
# sino que se corre este modulo independientemente.
FILE_NAME = 'REGION_I/R.I2009_10_1_15_50_53.log'

# Constante de cantidad de agentes usada si se ejecuta el modulo solo
CANT_AGENTS = 40

# Defino constante de escala para hacer snapshot
ESCALA = 1

HIST_NMBR = 0
def plotear(file=FILE_NAME , offline=False):
    global GLOBAL_VAR , K_VS_TIME
    
    # Abro archivo de log con datos de posiciones, velocidades y fuerzas
    input = open (file, 'r')
    
    # Divido el path del log en directorios
    log_name  = file.split('/')
    
    # Armo path hasta carpata de REGION correspondiente
    path_region = '/'.join(log_name[:-1])
    
    if not offline:
        path_to_file_k_vs_t = LOGS['k_vs_time'].name
        path_to_file_r_vs_t = LOGS['radius'].name
    else:
        path_to_file_k_vs_t = path_region+'/K_VS_TIME/'+log_name[-1]
        path_to_file_r_vs_t = path_region+'/RADIO/'+log_name[-1]

    
    
    
    # Hago ploteo de k vs time y obtengo ultimo valor de tiempo, que
    # uso para ir directamente en el archivo de log a ese tiempo y
    # realizar snapshot. De este modo el snapshot se realiza en el ultimo 
    # estado del sistema.
    time = generic_plot(path_to_file_k_vs_t , aux=1)
    r_average = generic_plot(path_to_file_r_vs_t , aux=0)
    
    
    # Si tengo bien seteada la variable de cantidad de agentes
    if GLOBAL_VAR['CANT_AGENT'] > 0:
        
        # Recupero su valor
        cant_agent = GLOBAL_VAR['CANT_AGENT']
        
    # Si la variable global tiene valor invalido
    else:
        
        # Cargo cantidad de agentes con la que seteo la constante CANT_AGENTS
        cant_agent = CANT_AGENTS 
    
    # Defino listas para guardar valores de posicion de los agentes
    # al momento de hacer el snapshot
    snapshot_x = []
    snapshot_y = []
    
    # Defino listas para guardar valores de velocidad de los agentes
    # al momento de hacer el snapshot
    snapshot_vx = []
    snapshot_vy = []
    
    # Defino la posicion de donde comenzar a recorrer datos a plotear
    iter = (time*cant_agent)+1
    
    # Obtengo todas las lineas del archivo log de datos con pos, vel y acel
    lineas = input.readlines()
    
    # Me quedo con las lineas que corresponden al tiempo en que deseo hacer
    # el snapshot
    lineas = lineas[iter:iter+cant_agent]

    # Para cada linea de dato del archivo log
    for l in lineas:
        
        # Separo datos
        data = l.split(',')
        
        # Recupero valores de coordenadas X e Y
        x_0 = float(data[1])
        y_0 = float(data[2])
        
        # Elimino datos que asumo no representativos
        # comentar las siguientes 2 lineas
        #if  x_0* ESCALA > 15 or x_0* ESCALA  < 3:
        #    continue
        # Guardo coordenadas de la posicion del agente
        snapshot_x.append( x_0 * ESCALA )
        snapshot_y.append( y_0 * ESCALA )
            
        # Guardo datos de la velocidad por coordenadas
        snapshot_vx.append(float(data[3]))
        snapshot_vy.append(float(data[4]))
    
    p.cla()
    # Cargo labels al ploteo para las coordenadas X e Y
    p.xlabel('X Position')
    p.ylabel('Y Position')
    
    # Cargo valor de dt
    dt = GLOBAL_VAR['dt']
    # Cargo titulo de ploteo
    p.title(log_name[-1]+' Time: '+str(time*dt))
    
    # Hago el snapshot
    p.quiver(snapshot_x, snapshot_y, snapshot_vx, snapshot_vy)
    
    # Guardo de ploteo generado
    p.savefig(path_region+'/'+log_name[-1][:-4]+".png")   
    
    # Muestro el ploteo
    p.show() 
    
# Input: si aux=1 se plotea la energia cinetica, si aux=0 se plotea el radio
def generic_plot(file, aux=1):
    
    # Abro archivo de log con valores de K VS TIME
    smile_shooter = open (file, 'r')
    # Defino variable donde se guardaran los valores de la K del sistema
    val = []
    t = []
    # Guardo todos los valores de la K total del sistema que se registraron
    i=0
    for line in smile_shooter.readlines():
        
        # Separo valores de tiempo y de la K total
        data = line.split(',')
        
        
        # Actualizo variable de tiempo
        time = int(data[0]) 
        t.append(time)
        
        try:
            # Guardo la K total en la lista
            value = float(data[1])
            val.append(value)
        except:
            print 'Error: Data : ',data
            print 'Error: Line : ', i, line
        i+=1
        
        
    # Cargo labels al ploteo para las coordenadas X e Y
    p.xlabel('Time')
    if aux == 1:
        p.ylabel('Kinetic Energy')
        
        # Cargo titulo de ploteo
        p.title('K vs Time')
        path = file.split('/')
        name_log = path[-1]
        file_name = '/'.join( path[:-2] )+'/'+name_log+'_k_vs_time.png'
        print "KINETIC PATH: ",file_name
        ret = time
    elif aux == 0:
        p.ylabel('Average Radius')
        
        # Cargo titulo de ploteo
        p.title('R vs Time')
        path = file.split('/')
        name_log = path[-1]
        file_name = '/'.join( path[:-2] )+'/'+name_log+'_r_vs_time.png'
        print "RADIO PATH: ",file_name
        ret = value
    # Hago el snapshot
    p.plot(t, val)
    
    # Guardo de ploteo generado
    p.savefig(file_name)
    
    # Limpio los ejes
    p.cla()
    
    return ret
    
# Por si corro el archivo con el comando 'python ploteo.py'
if __name__ == "__main__":
    
    # Llamo a funcion para hacer ploteo
    plotear(sys.argv[1], offline=True)

